import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use(backend="TkAgg")


'''
p 阶矩:
| 名称                     | 数学公式 | 代码                        |
| ---------------------- | ---- | ------------------------- |
| 一阶矩 (E[X])             | 平均值  | `np.mean(x)`              |
| 二阶矩 (E[X^2])           | 平方平均 | `np.mean(np.array(x)**2)` |
| 二阶均值根 (\sqrt{E[X^2]})  | RMS  | `np.sqrt(mean_of_square)` |
| 三阶矩 (E[X^3])           | 强调大值 | `np.mean(np.array(x)**3)` |
| 三阶均值根 ((E[X^3])^{1/3}) |      | `mean_cuberoot`           |

p 次方根
| 分布    | (E[X^2])                | 二阶根 ( \sqrt{E[X^2]} ) | 解释          |
| ----- | ----------------------- | --------------------- | ----------- |
| 电信号功率 | 平均功率                    | RMS（均方根）              | 表示“等效幅值”    |
| 误差    | Mean Squared Error(MSE) | Root MSE (RMSE)       | 更直观，和数值单位一致 |

p 阶矩是一种强调整体能量/尾部权重的测度，但单位不同；
p 次方根是把它“拉回原始尺度”，更好理解。


'''



# 示例数据
x = np.array([2, 3, 10, 20, 50])

# 设置 p 的范围
p_values = np.arange(1, 11)  # p = 1 到 10
moment_roots = []

for p in p_values:
    moment = np.mean(x**p)           # p 阶矩
    root_p = moment ** (1/p)         # p 阶均值根
    moment_roots.append(root_p)

# 绘制图像
plt.figure(figsize=(6,4))
plt.plot(p_values, moment_roots, marker='o')
plt.xlabel("p（阶数）")
plt.ylabel("p 阶均值根  (E[X^p])^(1/p)")
plt.title("p 阶均值根 随 p 增大变化（固定数据示例）")
plt.grid(True)
plt.tight_layout()
plt.show()

# 同时打印数据表
for p, val in zip(p_values, moment_roots):
    print(f"p={p}, (E[X^{p}])^(1/{p}) = {val:.4f}")
